hi this is debrupa nandi today is my second day with git

studies

observational - 1. collect data in a way that does not directly interfere with how the data arise(“observe”) 2. only establish an association 3. retrospective uses past data 4. prospective - data are collected throughout the study

experiment- randomly assign subjects to treatments

Confounding variables - extraneous variables that affect both the explanatory and the response variable and that make it seem like there is a relationship between them

Correlation does not imply causation Observational staements help make us make correlation statements Experiments help us infer causation

In statistics, a confounder is a variable that influences both the dependent variable and independent variable, causing a spurious association. Confounding is a causal concept, and as such, cannot be described in terms of correlations or associations.

library(dplyr)
library(ggplot2)
library(statsr)
data(arbuthnot)
View(arbuthnot)

library(dplyr)
library(ggplot2)
library(statsr)

data(present)
View(present)

present <- present %>%
  mutate(total = boys + girls)
prop_boys <- present$boys/present$total
present <- present %>%
  mutate(prop_boys)
ggplot(data = present, aes(x = year, y = prop_boys)) +
  geom_line() + geom_point() + geom_smooth()

present <- present %>%
  mutate(more_boys = present$boys > present$girls)
View(present)
present <- present %>%
  mutate(prop_boy_girl = boys / girls)
View(present)
ggplot(data = present, aes(x = year, y = prop_boy_girl)) +
  geom_line() + geom_point() + geom_smooth()

present <- present %>%
arrange(desc(total))

Robust statistics are statistics with good performance for data drawn from a wide range of probability distributions, especially for distributions that are not normal. Robust statistical methods have been developed for many common problems, such as estimating location, scale, and regression parameters.

The response variable is the focus of a question in a study or experiment. An explanatory variable is one that explains changes in that variable. It can be anything that might affect the response variable. Let’s say you’re trying to figure out if chemo or anti-estrogen treatment is better procedure for breast cancer patients. The question is: which procedure prolongs life more? And so survival time is the response variable. The type of therapy given is the explanatory variable; it may or may not affect the response variable. In this example, we have only one explanatory variable: type of treatment. In real life you would have several more explanatory variables, including: age, health, weight and other lifestyle factors.

Also known as a parallel boxplot or comparative boxplot, a side-by-side boxplot is a visual display comparing the levels (the possible values) of one categorical variable by means of a quantitative variable.

In statistical hypothesis testing, the p-value or probability value is, for a given statistical model, the probability that, when the null hypothesis is true, the statistical summary would be equal to, or more extreme than, the actual observed results.

library(devtools)
library(dplyr)
library(ggplot2)
library(shiny)

Questions and Solutions of Week 2

names(nycflights)
[1] "month"     "medianone"
data(nycflights)
View(nycflights)
str(nycflights)
Classes ‘tbl_df’ and 'data.frame':  32735 obs. of  16 variables:
 $ year     : int  2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 ...
 $ month    : int  6 5 12 5 7 1 12 8 9 4 ...
 $ day      : int  30 7 8 14 21 1 9 13 26 30 ...
 $ dep_time : int  940 1657 859 1841 1102 1817 1259 1920 725 1323 ...
 $ dep_delay: num  15 -3 -1 -4 -3 -3 14 85 -10 62 ...
 $ arr_time : int  1216 2104 1238 2122 1230 2008 1617 2032 1027 1549 ...
 $ arr_delay: num  -4 10 11 -34 -8 3 22 71 -8 60 ...
 $ carrier  : chr  "VX" "DL" "DL" "DL" ...
 $ tailnum  : chr  "N626VA" "N3760C" "N712TW" "N914DL" ...
 $ flight   : int  407 329 422 2391 3652 353 1428 1407 2279 4162 ...
 $ origin   : chr  "JFK" "JFK" "JFK" "JFK" ...
 $ dest     : chr  "LAX" "SJU" "LAX" "TPA" ...
 $ air_time : num  313 216 376 135 50 138 240 48 148 110 ...
 $ distance : num  2475 1598 2475 1005 296 ...
 $ hour     : num  9 16 8 18 11 18 12 19 7 13 ...
 $ minute   : num  40 57 59 41 2 17 59 20 25 23 ...

The dplyr package offers seven verbs (functions) for basic data manipulation:

filter() arrange() select() distinct() mutate() summarise() sample_n() ####

ggplot(data = nycflights, aes(x = dep_delay)) +
  geom_histogram()



ggplot(data = nycflights, aes(x = dep_delay)) +
  geom_histogram(binwidth = 25)



ggplot(data = nycflights, aes(x = dep_delay)) +
  geom_histogram(binwidth = 150)

 
rdu_flight <- nycflights %>%
filter(dest == "RDU")
ggplot(data = rdu_flight, aes(x = dep_delay)) + geom_histogram()

rdu_flight %>%
summarise(mean_dd = mean(dep_delay), sd_dd = sd(dep_delay), n = n())

Summary statistics: Some useful function calls for summary statistics for a single numerical variable are as follows:

mean median sd var IQR range min max ####


sfo_feb_flights <- nycflights %>%
filter(dest == "SFO", month == 2)
View(sfo_feb_flights)
sfo_feb_flights %>%
summarise(mean_one = mean(arr_delay), median_one = median(arr_delay), sd_one = sd(arr_delay), var_one = var(arr_delay), iqr_one = IQR(arr_delay), min_one = min(arr_delay), max_one = max(arr_delay))
ggplot(data = sfo_feb_flights, aes(x = arr_delay)) + geom_histogram()

sfo_feb_flights %>%
group_by(carrier) %>%
summarise(iqr_two = IQR(arr_delay)) %>%
arrange(desc(iqr_two))
nycflights %>%
group_by(month) %>%
summarise(mean_three = mean(dep_delay)) %>%
arrange(desc(mean_three))
ggplot(data = nycflights, aes(x = factor(month), y = dep_delay)) + geom_boxplot()

nycflights <- nycflights %>%
mutate(dep_type = ifelse(dep_delay < 5, "on time", "delayed"))
nycflights %>%
group_by(origin) %>%
summarise(ontimerate = sum(dep_type == "on time")/n()) %>%
arrange(desc(ontimerate))
nycflights %>%
group_by(month) %>%
summarise(medianone = median(dep_delay)) %>%
arrange(desc(medianone))
nycflights %>%
group_by(month) %>%
summarise(median_three = median(dep_delay)) %>%
arrange(desc(median_three))

We can also visualize the distribution of on on time departure rate across the three airports using a segmented bar plot.

ggplot(data = nycflights, aes(x = origin, fill = dep_type)) + geom_bar()

sfo_feb_flights %>%
group_by(carrier) %>%
summarise(iqr_two = IQR(arr_delay)) %>%
arrange(desc(iqr_two))
nycflights[,]
nycflights
nycflights <- nycflights %>%
  mutate(avg_speed = distance/air_time)
Error: object 'distance' not found
nycflights <- nycflights %>% 
  mutate(arr_type = ifelse(arr_delay<=0,"on time","delayed")) 

 

nycflights %>% 
  group_by(dep_type)%>%
  summarise(ot_arr_rate=sum(arr_type=="on time")/n())
LS0tDQp0aXRsZTogIkludHJvZHVjdGlvbiB0byBwcm9iYWJpbGl0eSBhbmQgZGF0YSINCmF1dGhvcjogIkRlYnJ1cGEgTmFuZGkiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpoaSB0aGlzIGlzIGRlYnJ1cGEgbmFuZGkNCioqdG9kYXkgaXMgbXkgc2Vjb25kIGRheSB3aXRoIGdpdCoqDQoNCg0KDQojIHN0dWRpZXMNCioqb2JzZXJ2YXRpb25hbCAtICoqDQoxLiBjb2xsZWN0IGRhdGEgaW4gYSB3YXkgdGhhdCBkb2VzIG5vdCBkaXJlY3RseSBpbnRlcmZlcmUgd2l0aCBob3cgdGhlIGRhdGEgYXJpc2UoIm9ic2VydmUiKQ0KMi4gb25seSBlc3RhYmxpc2ggYW4gYXNzb2NpYXRpb24NCjMuIHJldHJvc3BlY3RpdmUgdXNlcyBwYXN0IGRhdGENCjQuIHByb3NwZWN0aXZlIC0gZGF0YSBhcmUgY29sbGVjdGVkIHRocm91Z2hvdXQgdGhlIHN0dWR5DQoNCioqZXhwZXJpbWVudCoqLSByYW5kb21seSBhc3NpZ24gc3ViamVjdHMgdG8gdHJlYXRtZW50cw0KDQpDb25mb3VuZGluZyB2YXJpYWJsZXMgLSBleHRyYW5lb3VzIHZhcmlhYmxlcyB0aGF0IGFmZmVjdCBib3RoIHRoZSBleHBsYW5hdG9yeSBhbmQgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIGFuZCB0aGF0IG1ha2UgaXQgc2VlbSBsaWtlIHRoZXJlIGlzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlbQ0KDQoqKkNvcnJlbGF0aW9uIGRvZXMgbm90IGltcGx5IGNhdXNhdGlvbioqDQoqKk9ic2VydmF0aW9uYWwgc3RhZW1lbnRzIGhlbHAgbWFrZSB1cyBtYWtlIGNvcnJlbGF0aW9uIHN0YXRlbWVudHMqKg0KKipFeHBlcmltZW50cyBoZWxwIHVzIGluZmVyIGNhdXNhdGlvbioqDQoNCiFbXShpbWFnZXNfZm9yX3IvQW5ub3RhdGlvbiAyMDE5LTA4LTIxIDEyMzExMS5wbmcpDQoNCg0KDQohW10oaW1hZ2VzX2Zvcl9yL0Fubm90YXRpb24gMjAxOS0wOC0yMSAxMjM1NTYucG5nKQ0KDQoNCg0KIVtdKGltYWdlc19mb3Jfci9Bbm5vdGF0aW9uIDIwMTktMDgtMjEgMTIzODIwLnBuZykNCg0KIVtdKGltYWdlc19mb3Jfci9Bbm5vdGF0aW9uIDIwMTktMDgtMjEgMTI0MTA1LnBuZykNCg0KIVtdKGltYWdlc19mb3Jfci9Bbm5vdGF0aW9uIDIwMTktMDgtMjEgMTI0NDU2LnBuZykNCg0KDQoNCiFbXShpbWFnZXNfZm9yX3IvQW5ub3RhdGlvbiAyMDE5LTA4LTIxIDEyNTAzNC5wbmcpDQoNCg0KIVtdKGltYWdlc19mb3Jfci9Bbm5vdGF0aW9uIDIwMTktMDgtMjEgMTI1MjI3LnBuZykNCg0KDQoNCiFbXShpbWFnZXNfZm9yX3IvQW5ub3RhdGlvbiAyMDE5LTA4LTIxIDEzMDYxMS5wbmcpDQoNCiFbXShpbWFnZXNfZm9yX3IvQW5ub3RhdGlvbiAyMDE5LTA4LTIxIDEzMDkyMy5wbmcpDQoNCiMjIyMgSW4gc3RhdGlzdGljcywgYSBjb25mb3VuZGVyIGlzIGEgdmFyaWFibGUgdGhhdCBpbmZsdWVuY2VzIGJvdGggdGhlIGRlcGVuZGVudCB2YXJpYWJsZSBhbmQgaW5kZXBlbmRlbnQgdmFyaWFibGUsIGNhdXNpbmcgYSBzcHVyaW91cyBhc3NvY2lhdGlvbi4gQ29uZm91bmRpbmcgaXMgYSBjYXVzYWwgY29uY2VwdCwgYW5kIGFzIHN1Y2gsIGNhbm5vdCBiZSBkZXNjcmliZWQgaW4gdGVybXMgb2YgY29ycmVsYXRpb25zIG9yIGFzc29jaWF0aW9ucy4gIyMjIw0KDQohW10oaW1hZ2VzX2Zvcl9yL0Fubm90YXRpb24gMjAxOS0wOC0yMSAxMzE3MjMucG5nKQ0KDQohW10oaW1hZ2VzX2Zvcl9yL0Fubm90YXRpb24gMjAxOS0wOC0yMiAxMTAyNTkucG5nKQ0KDQohW10oaW1hZ2VzX2Zvcl9yL0Fubm90YXRpb24gMjAxOS0wOC0yMiAxMTE2NDUucG5nKQ0KDQohW10oaW1hZ2VzX2Zvcl9yL0Fubm90YXRpb24gMjAxOS0wOC0yMiAxMTIxNDMucG5nKQ0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShzdGF0c3IpDQpkYXRhKGFyYnV0aG5vdCkNClZpZXcoYXJidXRobm90KQ0KYGBgDQoNCg0KDQoNCiFbXShpbWFnZXNfZm9yX3IvQW5ub3RhdGlvbiAyMDE5LTA4LTIyIDExNDcxMS5wbmcpDQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc3RhdHNyKQ0KDQpkYXRhKHByZXNlbnQpDQpWaWV3KHByZXNlbnQpDQoNCnByZXNlbnQgPC0gcHJlc2VudCAlPiUNCiAgbXV0YXRlKHRvdGFsID0gYm95cyArIGdpcmxzKQ0KcHJvcF9ib3lzIDwtIHByZXNlbnQkYm95cy9wcmVzZW50JHRvdGFsDQpwcmVzZW50IDwtIHByZXNlbnQgJT4lDQogIG11dGF0ZShwcm9wX2JveXMpDQpnZ3Bsb3QoZGF0YSA9IHByZXNlbnQsIGFlcyh4ID0geWVhciwgeSA9IHByb3BfYm95cykpICsNCiAgZ2VvbV9saW5lKCkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aCgpDQpwcmVzZW50IDwtIHByZXNlbnQgJT4lDQogIG11dGF0ZShtb3JlX2JveXMgPSBwcmVzZW50JGJveXMgPiBwcmVzZW50JGdpcmxzKQ0KVmlldyhwcmVzZW50KQ0KcHJlc2VudCA8LSBwcmVzZW50ICU+JQ0KICBtdXRhdGUocHJvcF9ib3lfZ2lybCA9IGJveXMgLyBnaXJscykNClZpZXcocHJlc2VudCkNCmdncGxvdChkYXRhID0gcHJlc2VudCwgYWVzKHggPSB5ZWFyLCB5ID0gcHJvcF9ib3lfZ2lybCkpICsNCiAgZ2VvbV9saW5lKCkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aCgpDQpwcmVzZW50IDwtIHByZXNlbnQgJT4lDQphcnJhbmdlKGRlc2ModG90YWwpKQ0KDQoNCmBgYA0KIyMjIyBSb2J1c3Qgc3RhdGlzdGljcyBhcmUgc3RhdGlzdGljcyB3aXRoIGdvb2QgcGVyZm9ybWFuY2UgZm9yIGRhdGEgZHJhd24gZnJvbSBhIHdpZGUgcmFuZ2Ugb2YgcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9ucywgZXNwZWNpYWxseSBmb3IgZGlzdHJpYnV0aW9ucyB0aGF0IGFyZSBub3Qgbm9ybWFsLiBSb2J1c3Qgc3RhdGlzdGljYWwgbWV0aG9kcyBoYXZlIGJlZW4gZGV2ZWxvcGVkIGZvciBtYW55IGNvbW1vbiBwcm9ibGVtcywgc3VjaCBhcyBlc3RpbWF0aW5nIGxvY2F0aW9uLCBzY2FsZSwgYW5kIHJlZ3Jlc3Npb24gcGFyYW1ldGVycy4gIyMjIw0KDQojIyMjIFRoZSByZXNwb25zZSB2YXJpYWJsZSBpcyB0aGUgZm9jdXMgb2YgYSBxdWVzdGlvbiBpbiBhIHN0dWR5IG9yIGV4cGVyaW1lbnQuIEFuIGV4cGxhbmF0b3J5IHZhcmlhYmxlIGlzIG9uZSB0aGF0IGV4cGxhaW5zIGNoYW5nZXMgaW4gdGhhdCB2YXJpYWJsZS4gSXQgY2FuIGJlIGFueXRoaW5nIHRoYXQgbWlnaHQgYWZmZWN0IHRoZSByZXNwb25zZSB2YXJpYWJsZS4gTGV04oCZcyBzYXkgeW914oCZcmUgdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgaWYgY2hlbW8gb3IgYW50aS1lc3Ryb2dlbiB0cmVhdG1lbnQgaXMgYmV0dGVyIHByb2NlZHVyZSBmb3IgYnJlYXN0IGNhbmNlciBwYXRpZW50cy4gVGhlIHF1ZXN0aW9uIGlzOiB3aGljaCBwcm9jZWR1cmUgcHJvbG9uZ3MgbGlmZSBtb3JlPyBBbmQgc28gc3Vydml2YWwgdGltZSBpcyB0aGUgcmVzcG9uc2UgdmFyaWFibGUuIFRoZSB0eXBlIG9mIHRoZXJhcHkgZ2l2ZW4gaXMgdGhlIGV4cGxhbmF0b3J5IHZhcmlhYmxlOyBpdCBtYXkgb3IgbWF5IG5vdCBhZmZlY3QgdGhlIHJlc3BvbnNlIHZhcmlhYmxlLiBJbiB0aGlzIGV4YW1wbGUsIHdlIGhhdmUgb25seSBvbmUgZXhwbGFuYXRvcnkgdmFyaWFibGU6IHR5cGUgb2YgdHJlYXRtZW50LiBJbiByZWFsIGxpZmUgeW91IHdvdWxkIGhhdmUgc2V2ZXJhbCBtb3JlIGV4cGxhbmF0b3J5IHZhcmlhYmxlcywgaW5jbHVkaW5nOiBhZ2UsIGhlYWx0aCwgd2VpZ2h0IGFuZCBvdGhlciBsaWZlc3R5bGUgZmFjdG9ycy4gIyMjIw0KDQohW10oaW1hZ2VzX2Zvcl9yL0Fubm90YXRpb24gMjAxOS0wOC0yMiAxNTAzNTUucG5nKQ0KDQohW10oaW1hZ2VzX2Zvcl9yL0Fubm90YXRpb24gMjAxOS0wOC0yMiAxNTA1MjYucG5nKQ0KDQohW10oaW1hZ2VzX2Zvcl9yL0Fubm90YXRpb24gMjAxOS0wOC0yMiAxNTE0NDMucG5nKQ0KDQoNCg0KIVtdKGltYWdlc19mb3Jfci9Bbm5vdGF0aW9uIDIwMTktMDgtMjIgMTUxNTQ1LnBuZykNCg0KIVtdKGltYWdlc19mb3Jfci9Bbm5vdGF0aW9uIDIwMTktMDgtMjIgMTUxOTUxLnBuZykNCg0KDQohW10oaW1hZ2VzX2Zvcl9yL0Fubm90YXRpb24gMjAxOS0wOC0yMiAxNTI3MTEucG5nKQ0KDQohW10oaW1hZ2VzX2Zvcl9yL0Fubm90YXRpb24gMjAxOS0wOC0yMiAxNTQ1NTEucG5nKQ0KDQohW10oaW1hZ2VzX2Zvcl9yL0Fubm90YXRpb24gMjAxOS0wOC0yMiAxNTU4MzAucG5nKQ0KDQoNCiFbXShpbWFnZXNfZm9yX3IvQW5ub3RhdGlvbiAyMDE5LTA4LTIyIDE2MzEzMy5wbmcpDQoNCg0KDQohW10oaW1hZ2VzX2Zvcl9yL0Fubm90YXRpb24gMjAxOS0wOC0yMiAxNjM0MTIucG5nKQ0KDQoNCg0KIVtdKGltYWdlc19mb3Jfci9Bbm5vdGF0aW9uIDIwMTktMDgtMjIgMTY0MzAxLnBuZykNCg0KDQohW10oaW1hZ2VzX2Zvcl9yL0Fubm90YXRpb24gMjAxOS0wOC0yMiAxNjU3MDEucG5nKQ0KDQohW10oaW1hZ2VzX2Zvcl9yL0Fubm90YXRpb24gMjAxOS0wOC0yMiAxNjU4NDIucG5nKQ0KDQoNCiMjIyMgIEFsc28ga25vd24gYXMgYSBwYXJhbGxlbCBib3hwbG90IG9yIGNvbXBhcmF0aXZlIGJveHBsb3QsIGEgc2lkZS1ieS1zaWRlIGJveHBsb3QgaXMgYSB2aXN1YWwgZGlzcGxheSBjb21wYXJpbmcgdGhlIGxldmVscyAodGhlIHBvc3NpYmxlIHZhbHVlcykgb2Ygb25lIGNhdGVnb3JpY2FsIHZhcmlhYmxlIGJ5IG1lYW5zIG9mIGEgcXVhbnRpdGF0aXZlIHZhcmlhYmxlLiAjIyMjDQoNCiFbXShpbWFnZXNfZm9yX3IvQW5ub3RhdGlvbiAyMDE5LTA4LTIyIDE3NDkwOS5wbmcpDQoNCg0KDQohW10oaW1hZ2VzX2Zvcl9yL0Fubm90YXRpb24gMjAxOS0wOC0yMiAxNzU0MDcucG5nKQ0KDQoNCg0KIVtdKGltYWdlc19mb3Jfci9Bbm5vdGF0aW9uIDIwMTktMDgtMjIgMTc1NTU5LnBuZykNCg0KDQojIyMjIEluIHN0YXRpc3RpY2FsIGh5cG90aGVzaXMgdGVzdGluZywgdGhlIHAtdmFsdWUgb3IgcHJvYmFiaWxpdHkgdmFsdWUgaXMsIGZvciBhIGdpdmVuIHN0YXRpc3RpY2FsIG1vZGVsLCB0aGUgcHJvYmFiaWxpdHkgdGhhdCwgd2hlbiB0aGUgbnVsbCBoeXBvdGhlc2lzIGlzIHRydWUsIHRoZSBzdGF0aXN0aWNhbCBzdW1tYXJ5IHdvdWxkIGJlIGVxdWFsIHRvLCBvciBtb3JlIGV4dHJlbWUgdGhhbiwgdGhlIGFjdHVhbCBvYnNlcnZlZCByZXN1bHRzLiAjIyMjDQoNCg0KDQoNCg0KDQpgYGB7cn0NCmxpYnJhcnkoZGV2dG9vbHMpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShzaGlueSkNCg0KDQpgYGANCiMjIyMgUXVlc3Rpb25zIGFuZCBTb2x1dGlvbnMgb2YgV2VlayAyICMjIyMNCg0KDQpgYGB7cn0NCm5hbWVzKG55Y2ZsaWdodHMpDQpkYXRhKG55Y2ZsaWdodHMpDQpWaWV3KG55Y2ZsaWdodHMpDQpzdHIobnljZmxpZ2h0cykNCmBgYA0KDQoNCg0KIyMjIyBUaGUgZHBseXIgcGFja2FnZSBvZmZlcnMgc2V2ZW4gdmVyYnMgKGZ1bmN0aW9ucykgZm9yIGJhc2ljIGRhdGEgbWFuaXB1bGF0aW9uOg0KDQoqZmlsdGVyKCkqDQoqYXJyYW5nZSgpKg0KKnNlbGVjdCgpKg0KKmRpc3RpbmN0KCkqDQoqbXV0YXRlKCkqDQoqc3VtbWFyaXNlKCkqDQoqc2FtcGxlX24oKSoNCiAjIyMjDQogDQpgYGB7cn0NCmdncGxvdChkYXRhID0gbnljZmxpZ2h0cywgYWVzKHggPSBkZXBfZGVsYXkpKSArDQogIGdlb21faGlzdG9ncmFtKCkNCg0KDQpnZ3Bsb3QoZGF0YSA9IG55Y2ZsaWdodHMsIGFlcyh4ID0gZGVwX2RlbGF5KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDI1KQ0KDQoNCmdncGxvdChkYXRhID0gbnljZmxpZ2h0cywgYWVzKHggPSBkZXBfZGVsYXkpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMTUwKQ0KYGBgDQogDQogDQpgYGB7cn0NCiANCnJkdV9mbGlnaHQgPC0gbnljZmxpZ2h0cyAlPiUNCmZpbHRlcihkZXN0ID09ICJSRFUiKQ0KZ2dwbG90KGRhdGEgPSByZHVfZmxpZ2h0LCBhZXMoeCA9IGRlcF9kZWxheSkpICsgZ2VvbV9oaXN0b2dyYW0oKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCnJkdV9mbGlnaHQgJT4lDQpzdW1tYXJpc2UobWVhbl9kZCA9IG1lYW4oZGVwX2RlbGF5KSwgc2RfZGQgPSBzZChkZXBfZGVsYXkpLCBuID0gbigpKQ0KYGBgDQoNCg0KDQojIyMjIFN1bW1hcnkgc3RhdGlzdGljczogU29tZSB1c2VmdWwgZnVuY3Rpb24gY2FsbHMgZm9yIHN1bW1hcnkgc3RhdGlzdGljcyBmb3IgYSBzaW5nbGUgbnVtZXJpY2FsIHZhcmlhYmxlIGFyZSBhcyBmb2xsb3dzOg0KDQptZWFuDQptZWRpYW4NCnNkDQp2YXINCklRUg0KcmFuZ2UNCm1pbg0KbWF4ICMjIyMNCg0KDQpgYGB7cn0NCg0Kc2ZvX2ZlYl9mbGlnaHRzIDwtIG55Y2ZsaWdodHMgJT4lDQpmaWx0ZXIoZGVzdCA9PSAiU0ZPIiwgbW9udGggPT0gMikNClZpZXcoc2ZvX2ZlYl9mbGlnaHRzKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCnNmb19mZWJfZmxpZ2h0cyAlPiUNCnN1bW1hcmlzZShtZWFuX29uZSA9IG1lYW4oYXJyX2RlbGF5KSwgbWVkaWFuX29uZSA9IG1lZGlhbihhcnJfZGVsYXkpLCBzZF9vbmUgPSBzZChhcnJfZGVsYXkpLCB2YXJfb25lID0gdmFyKGFycl9kZWxheSksIGlxcl9vbmUgPSBJUVIoYXJyX2RlbGF5KSwgbWluX29uZSA9IG1pbihhcnJfZGVsYXkpLCBtYXhfb25lID0gbWF4KGFycl9kZWxheSkpDQpnZ3Bsb3QoZGF0YSA9IHNmb19mZWJfZmxpZ2h0cywgYWVzKHggPSBhcnJfZGVsYXkpKSArIGdlb21faGlzdG9ncmFtKCkNCmBgYA0KDQpgYGB7cn0NCnNmb19mZWJfZmxpZ2h0cyAlPiUNCmdyb3VwX2J5KGNhcnJpZXIpICU+JQ0Kc3VtbWFyaXNlKGlxcl90d28gPSBJUVIoYXJyX2RlbGF5KSkgJT4lDQphcnJhbmdlKGRlc2MoaXFyX3R3bykpDQpgYGANCg0KYGBge3J9DQpueWNmbGlnaHRzICU+JQ0KZ3JvdXBfYnkobW9udGgpICU+JQ0Kc3VtbWFyaXNlKG1lYW5fdGhyZWUgPSBtZWFuKGRlcF9kZWxheSkpICU+JQ0KYXJyYW5nZShkZXNjKG1lYW5fdGhyZWUpKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCmdncGxvdChkYXRhID0gbnljZmxpZ2h0cywgYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZGVwX2RlbGF5KSkgKyBnZW9tX2JveHBsb3QoKQ0KYGBgDQoNCmBgYHtyfQ0KbnljZmxpZ2h0cyA8LSBueWNmbGlnaHRzICU+JQ0KbXV0YXRlKGRlcF90eXBlID0gaWZlbHNlKGRlcF9kZWxheSA8IDUsICJvbiB0aW1lIiwgImRlbGF5ZWQiKSkNCm55Y2ZsaWdodHMgJT4lDQpncm91cF9ieShvcmlnaW4pICU+JQ0Kc3VtbWFyaXNlKG9udGltZXJhdGUgPSBzdW0oZGVwX3R5cGUgPT0gIm9uIHRpbWUiKS9uKCkpICU+JQ0KYXJyYW5nZShkZXNjKG9udGltZXJhdGUpKQ0KYGBgDQoNCmBgYHtyfQ0KbnljZmxpZ2h0cyAlPiUNCmdyb3VwX2J5KG1vbnRoKSAlPiUNCnN1bW1hcmlzZShtZWRpYW5vbmUgPSBtZWRpYW4oZGVwX2RlbGF5KSkgJT4lDQphcnJhbmdlKGRlc2MobWVkaWFub25lKSkNCmBgYA0KDQpgYGB7cn0NCm55Y2ZsaWdodHMgJT4lDQpncm91cF9ieShtb250aCkgJT4lDQpzdW1tYXJpc2UobWVkaWFuX3RocmVlID0gbWVkaWFuKGRlcF9kZWxheSkpICU+JQ0KYXJyYW5nZShkZXNjKG1lZGlhbl90aHJlZSkpDQpgYGANCg0KIyMjIyBXZSBjYW4gYWxzbyB2aXN1YWxpemUgdGhlIGRpc3RyaWJ1dGlvbiBvZiBvbiBvbiB0aW1lIGRlcGFydHVyZSByYXRlIGFjcm9zcyB0aGUgdGhyZWUgYWlycG9ydHMgdXNpbmcgYSBzZWdtZW50ZWQgYmFyIHBsb3QuICMjIyMNCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IG55Y2ZsaWdodHMsIGFlcyh4ID0gb3JpZ2luLCBmaWxsID0gZGVwX3R5cGUpKSArIGdlb21fYmFyKCkNCmBgYA0KDQpgYGB7cn0NCnNmb19mZWJfZmxpZ2h0cyAlPiUNCmdyb3VwX2J5KGNhcnJpZXIpICU+JQ0Kc3VtbWFyaXNlKGlxcl90d28gPSBJUVIoYXJyX2RlbGF5KSkgJT4lDQphcnJhbmdlKGRlc2MoaXFyX3R3bykpDQpgYGANCg0KDQoNCg0KYGBge3J9DQpueWNmbGlnaHRzWyxdDQpgYGANCmBgYHtyfQ0KbnljZmxpZ2h0cw0KYGBgDQoNCmBgYHtyfQ0KbnljZmxpZ2h0cyA8LSBueWNmbGlnaHRzICU+JQ0KICBtdXRhdGUoYXZnX3NwZWVkID0gZGlzdGFuY2UvYWlyX3RpbWUpDQpnZ3Bsb3QoZGF0YSA9IG55Y2ZsaWdodHMsIGFlcyh4ID0gZGlzdGFuY2UsIHkgPSBhdmdfc3BlZWQpKSArIGdlb21fcG9pbnQoKQ0KDQpgYGANCg0KYGBge3J9DQpueWNmbGlnaHRzIDwtIG55Y2ZsaWdodHMgJT4lIA0KICBtdXRhdGUoYXJyX3R5cGUgPSBpZmVsc2UoYXJyX2RlbGF5PD0wLCJvbiB0aW1lIiwiZGVsYXllZCIpKSANCg0KIA0KDQpueWNmbGlnaHRzICU+JSANCiAgZ3JvdXBfYnkoZGVwX3R5cGUpJT4lDQogIHN1bW1hcmlzZShvdF9hcnJfcmF0ZT1zdW0oYXJyX3R5cGU9PSJvbiB0aW1lIikvbigpKQ0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=